home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / data / happysrc / pcmain.c < prev    next >
Text File  |  1993-11-30  |  8KB  |  211 lines

  1. /************************************************
  2.  *                                              *
  3.  *       ***************************            *
  4.  *       *  HAPPy Pascal Compiler  *            *
  5.  *       ***************************            *
  6.  * ( HAPPy = H.Asano Pascal Processing system ) *
  7.  *                                              *
  8.  *     Original program                         *
  9.  *             ---  Pascal P4 ---               *
  10.  *                                              *
  11.  *     Pascal-P4は、public domainらしい。        *
  12.  *     このHAPPyの著作権は浅野比富美にある。     *
  13.  *     HAPPyは、Pascal-p4のソースをもとに、     *
  14.  *     アルゴリズムにたちかえって解析し、       *
  15.  *     PascalからC言語に書換え、ISO7185規格に    *
  16.  *     準拠させるため、独自の創作を加えたもの   *
  17.  *     である。                                  *
  18.  *                                              *
  19.  *        Copyright(c) H.Asano. 1992,1993       *
  20.  *           All rights resereved.              *
  21.  *                                              *
  22.  ************************************************/
  23.  
  24. #define EXTERN                          /* pascomp.hで使用            */
  25.  
  26. #define error     1                     /* usage関数への引数          */
  27. #define normal    0                     /* usage関数への引数          */
  28.  
  29. #define NormalEnd     0                 /* 正常終了の終了コード       */
  30. #define CompileError  1                 /* コンパイルエラーの終了コード*/
  31. #define EtcError      2                 /* その他のエラーの終了コード */
  32.  
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include <process.h>
  36. #include <stdlib.h>
  37. #include <ctype.h>
  38. #include "version.h"
  39. #include "pascomp.h"
  40.  
  41. extern void init(void) ;
  42. extern void insymbol(void);
  43. extern void programme(void);
  44.  
  45. void term(void) ;
  46.  
  47. static void argment(int,char**) ;
  48. static void usage(int)         ;
  49.  
  50. FILE *passource ;                       /* pascalソースファイルポインタ */
  51. FILE *pcdfile   ;                       /* P-codeソースファイルポインタ */
  52.  
  53. static char *asm = "PA.OVL" ;           /* アセンブラのファイル名       */
  54. static char *TempPath       ;           /* 環境変数 TMP の 設定内容     */
  55. static char *PcodeSourceName = "pcode.pcs" ;  /* P-codeソースファイル名 */
  56. static char PcodeSname[30]    ;        /* P-codeソースファイル名        */
  57. static char drive[3] ;
  58. static char dir[31] ;
  59. static char fname[9] ;
  60. static char ext[4] ;
  61.  
  62. static boolean asmlst = false  ;
  63.  
  64. /**************************************/
  65. /*       main() : メイン処理          */
  66. /**************************************/
  67. void main(int argc,char *argv[])
  68. {
  69.  
  70.     fprintf(stderr,
  71.  "HAPPy Pascal Compiler Version %s  Copyright (c) H.Asano 1992,1993\n",
  72.                                 version) ;
  73.  
  74.     argment(argc,argv) ;                /* 起動アーギュメント処理     */
  75.  
  76.     init();                             /* compiler 初期設定処理      */
  77.  
  78.     insymbol();                         /* 最初のsymbolを読む         */
  79.     programme();                        /* programのコンパイル        */
  80.  
  81.     term() ;                            /* 終了処理                   */
  82. }
  83.  
  84. /**************************************/
  85. /* argment() : 起動アーギュメント処理 */
  86. /**************************************/
  87. static void argment(int argc,char *argv[])
  88. {
  89.   int  j  ;
  90.   boolean getfileflag = false ;
  91.  
  92.     if(argc < 2)  usage(normal);        /* アーギュメントなしの時はusage*/
  93.  
  94.     _splitpath(argv[0],drive,dir,fname,ext) ; /* コマンド名の分解     */
  95.     TempPath = getenv("TMP") ;          /* 環境変数 TMP を取得        */
  96.     pcode = true  ;                     /* Pコード出力要(デフォルト)      */
  97.     pcdinf= false ;                     /* Pコード情報出力不要(デフォルト)*/
  98.     debug = false ;                     /* 範囲チェック不要(デフォルト)   */
  99.     while(--argc) {
  100.      if(getfileflag) {
  101.        usage(error);                    /* ソースファイル名以降に     */
  102.        break ;                          /* アーギュメントがある場合   */
  103.      }
  104.      if(**++argv == '-') {
  105.       for(j=1;*(*argv+j)!='\0';j++) {
  106.        switch(tolower(*(*argv+j))) {    /* 大文字の時は小文字に変換   */
  107.         case 'c' : pcode  = false ;
  108.                    break          ;
  109.         case 'a' : pcode  = true  ;
  110.                    pcdinf = true  ;
  111.                    asmlst = true  ;
  112.                    break          ;
  113.         case 'd' : debug  = true  ;
  114.                    break          ;
  115.         default  : usage(error)   ;
  116.        }
  117.       }
  118.       if(j==1)  usage(error);           /* - だけの時はusage          */
  119.      }
  120.      else {
  121.       getfileflag = true ;
  122.       passname  = *argv++;
  123.      }
  124.     }
  125.  
  126.     if(getfileflag) {                   /* ファイル名が指定された時   */
  127.      passource = fopen(passname,"r");
  128.      if(passource == NULL) {
  129.       fprintf(stderr,"C002: Pascalソースファイル(%s)がない\n", passname);
  130.       exit(EtcError);
  131.      }
  132.     }
  133.     else usage(error) ;                 /* ファイル名の指定がない時   */
  134.  
  135.     if(pcode) {
  136.      strcpy(PcodeSname,TempPath) ;
  137.      strcat(PcodeSname,PcodeSourceName) ;
  138.      pcdfile = fopen(PcodeSname,"w");
  139.      if(pcdfile == NULL) {
  140.       fprintf(stderr,"C003: P-codeソースファイル(%s)が作れない\n",PcodeSname) ;
  141.       exit(EtcError);
  142.      }
  143.     }
  144. }
  145.  
  146. /**************************************/
  147. /*    usage() : 使用方法出力処理      */
  148. /**************************************/
  149. static void usage(int type)
  150. {
  151. if(type == error)
  152.  fputs("\nC001: 起動パラメータが誤っている\n",stderr);
  153. else {
  154.  fputs("\n  HAPPy is the H.Asano Pascal Processing system. (^_^)\n",
  155.              stderr);
  156.  fputs(
  157.   "\n  HAPPyはISO7185規格水準0にほぼ準拠したMS-DOS汎用Pascal処理系です。\n",
  158.            stderr) ;
  159.  fputs("  HAPPyの複写・再配付は自由です。\n", stderr) ;
  160. }
  161.  
  162. fputs("\n  pcコマンドはPascalソースからカレントディレクトリにP-codeオブジェクト(pcode.pco)を\n",
  163.          stderr);
  164. fputs("  作ります。できたオブジェクトはpiコマンドで実行させます。\n\n",stderr);
  165.  
  166.      fputs("  使い方:  pc [ オプション... ] Pascalソースファイル名\n",stderr) ;
  167.  
  168.      fputs("  オプション:\n",stderr);
  169.      fputs("     -c ・・・ 構文チェックのみ行う\n",stderr);
  170.      fputs("     -a ・・・ アセンブルリストを標準出力に出力する\n",stderr);
  171.      fputs("     -d ・・・ 範囲チェック等を行うコードを生成する\n",stderr);
  172.  
  173.      exit(EtcError);                    /* その他のエラーで終了       */
  174. }
  175.  
  176. /***************************************/
  177. /*         term() : 終了処理           */
  178. /***************************************/
  179. void term(void)
  180. {
  181.   int resultcode ;
  182.   char instsize[7]  ;
  183.  
  184.     if(pcode && (errorcount == 0)) {
  185.      fputs(" *** Compile  completed. ***\n",stderr) ;
  186.      fclose(pcdfile) ;
  187.      sprintf(instsize,"%d",ic) ;
  188.      if(asmlst)
  189.       resultcode=execl(strcat(strcat(drive,dir),asm),"",
  190.                        instsize,PcodeSname,version,"l",NULL);
  191.                                                  /* アセンブルリスト付*/
  192.      else
  193.       resultcode=execl(strcat(strcat(drive,dir),asm),"",
  194.                        instsize,PcodeSname,version,NULL) ;
  195.                                                  /* 通常のアセンブル  */
  196.      if(resultcode == -1) {             /* アセンブラが起動できない   */
  197.       fprintf(stderr,"C004: アセンブラ(%s)が起動できない\n",asm) ;
  198.       exit(EtcError) ;
  199.      }
  200.     }
  201.     else if(errorcount != 0) {
  202.      fprintf(stderr," *** %d errors detected. Fail in compile ***\n",
  203.                       errorcount);
  204.     exit(CompileError) ;
  205.     }
  206.     else {                              /* pcode = false              */
  207.      fputs(" *** No Error ***\n",stderr);
  208.      exit(NormalEnd) ;
  209.     }
  210. }
  211.